import scrapy
from scrapy.pipelines.images import ImagesPipeline  # 导入Scrapy的图片下载管道
import logging  # 导入日志模块，用于记录下载错误信息
from scrapy.exceptions import DropItem  # 导入DropItem异常，用于丢弃无法处理的项目

class ImagePipeline(ImagesPipeline):
    # 获取媒体请求的方法
    def get_media_requests(self, item, info):
        # 遍历每个图片URL
        for image_url in item['image_urls']:
            if image_url:  # 确保 URL 不为 None
                # 返回一个新的请求，设置 User-Agent 伪装成浏览器
                yield scrapy.Request(image_url, headers={
                    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
                })

    # 处理请求完成后的结果
    def item_completed(self, results, item, info):
        failed_urls = []  # 用于存储下载失败的URL
        # 遍历请求结果
        for ok, x in results:
            if not ok:  # 如果下载失败
                failed_urls.append(x.value)  # 将失败的URL加入列表

        if failed_urls:  # 如果有失败的URL
            # 记录错误日志
            logging.error(f'Failed to download images for URLs: {failed_urls}')
            # 丢弃包含下载失败的项目
            raise DropItem(f"Image download failed for: {failed_urls}")

        return item  # 返回成功下载的项目
